package com.micro.ai.commons.domain;

import lombok.Builder;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户上下文
 * 
 * @author micro-ai
 * @since 0.0.1
 */
@Builder
public record UserContext(
    /**
     * 用户ID
     */
    Long userId,
    
    /**
     * 用户名
     */
    String username,
    
    /**
     * 用户昵称
     */
    String nickname,
    
    /**
     * 用户邮箱
     */
    String email,
    
    /**
     * 用户手机号
     */
    String phone,
    
    /**
     * 用户角色列表
     */
    List<String> roles,
    
    /**
     * 用户权限列表
     */
    List<String> permissions,
    
    /**
     * 访问令牌
     */
    String accessToken,
    
    /**
     * 刷新令牌
     */
    String refreshToken,
    
    /**
     * 令牌过期时间
     */
    LocalDateTime tokenExpireTime,
    
    /**
     * 租户ID
     */
    String tenantId,
    
    /**
     * 用户状态
     */
    String status,
    
    /**
     * 登录时间
     */
    LocalDateTime loginTime,
    
    /**
     * 登录IP
     */
    String loginIp,
    
    /**
     * 用户代理
     */
    String userAgent
) implements Serializable {

    /**
     * 判断用户是否已登录
     */
    public boolean isLoggedIn() {
        return userId != null && accessToken != null;
    }

    /**
     * 判断令牌是否已过期
     */
    public boolean isTokenExpired() {
        return tokenExpireTime != null && LocalDateTime.now().isAfter(tokenExpireTime);
    }

    /**
     * 判断用户是否有指定角色
     */
    public boolean hasRole(String role) {
        return roles != null && roles.contains(role);
    }

    /**
     * 判断用户是否有指定权限
     */
    public boolean hasPermission(String permission) {
        return permissions != null && permissions.contains(permission);
    }

    /**
     * 判断用户是否有任一角色
     */
    public boolean hasAnyRole(String... roles) {
        if (this.roles == null || roles == null) {
            return false;
        }
        for (String role : roles) {
            if (this.roles.contains(role)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断用户是否有任一权限
     */
    public boolean hasAnyPermission(String... permissions) {
        if (this.permissions == null || permissions == null) {
            return false;
        }
        for (String permission : permissions) {
            if (this.permissions.contains(permission)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 获取用户显示名称
     */
    public String getDisplayName() {
        if (nickname != null && !nickname.trim().isEmpty()) {
            return nickname;
        }
        return username;
    }
}
